// @Creation:	30.04.2012
// @Version:	01.05.2012
// 
// @cpu:	x86,
// @author:	alexey kurshakov [alexey.kurshakov@gmail.com]
//
// @Contents:	serialport.h 
//	Функции для работы с последовательным портом
//
#pragma once

#ifdef WIN32
#include <windows.h>
#else
#endif
#include <stdio.h>

// Перечисление паритетов для работы с COM-портом
enum {
	eParityNone,	// нет паритета
	eParityOdd,		// нечетный паритет
	eParityEven,	// четный паритет
	eParityMark,	//
	eParitySpace,	//
};

// Перечисление возможных значений для стоп-битов
enum {	
	eOneStopBit,		// 1 стоп-бит
	eOneHalfStopBit,	// 1,5 стоп-бита
	eTwoStopBits,		// 2 стоп-бита
};

// Перечисление ошибок
enum {
	eNoError,			// нет ошибок
	eUnknownDevice,		// неизвестное устройство, нет такого
	eIOTimeOut,			// вышел таймаут при операцих ввода/вывода
	eIOError,			// ошибка при обмене данным с портом ввода/вывода
	eInvalidData,		// данных не существует, нулевой указатель
	eFail,				// что-то не так...
};
typedef int ErrorRes;

// Структура настроек для конфигурации COM-порта
typedef struct {
	char* devName;			// имя устройства
	unsigned int baudRate;	// скорость работы порта
	int parity;				// паритет
	char byteSize;			// размер байта
	char stopBits;			// количество стоп-битов
	unsigned int ioTimeOutMs; // таймаут при io-операциях
	// seems to me this is pointless for general tasks
	// char dtrControl;
	// char rtsControl;
	// char ctsFlow;
	// char dsrFlow;
} COMPortSettings;

// Пытаемся открыть COM-порт, конфигурируем его в соотв-ии с настройками
ErrorRes OpenCOMPort(COMPortSettings* settings, void* hGoCOMPort, void** pUnExportedValues);

// Пишем данные в COM-порт
ErrorRes WriteDataToCOMPort(void* pUnExportedValues, void* data, int* dataSize);

// Читаем данные из COM-порта
ErrorRes ReadDataFromCOMPort(void* pUnExportedValues);

// Закрываем COM-порт, высвобождаем ресурсы
ErrorRes CloseCOMPort(void* pUnExportedValues);
